#!/usr/bin/env node

import fs from 'fs'
import path from 'path'
import readline from 'readline'
import { fileURLToPath } from 'url'
import {
  DEFAULT_FORM_COLUMNS,
  DEFAULT_FORM_RULES,
  DEFAULT_FORM_STATE,
} from './templates/form/fields'

const __filename = fileURLToPath(import.meta.url)
const __dirname = path.dirname(__filename)

// 创建readline接口
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
})

// 模板文件路径
const TEMPLATE_FILE = path.join(__dirname, 'templates', 'form', 'index.vue')

// 提示用户输入
const question = (query: string): Promise<string> => {
  return new Promise(resolve => {
    rl.question(query, resolve)
  })
}

// 读取模板文件
const loadTemplate = (): string => {
  try {
    return fs.readFileSync(TEMPLATE_FILE, 'utf8')
  } catch (error) {
    console.error('❌ 读取模板文件失败:', (error as Error).message)
    console.error('请确保模板文件存在: scripts/templates/form.vue')
    process.exit(1)
  }
}

// 格式化对象为字符串（统一处理引号格式）
const formatObjectString = (obj: any): string => {
  let str = JSON.stringify(obj, null, 2)

  // 处理特殊表达式（如 new Date()）
  str = str.replace(/"new Date\(\)\.toString\(\)"/g, 'new Date().toString()')

  // 处理 fieldProps 函数
  str = str.replace(/"fieldProps":\s*"([^"]+)"/g, (_, propsString) => {
    return `fieldProps: ${propsString.replace(/\\'/g, "'")}`
  })

  // 去掉对象 key 的引号
  str = str.replace(/"(\w+)":/g, '$1:')

  // 将值的双引号改为单引号
  str = str.replace(/:\s*"([^"]+)"/g, (_, value) => {
    const escapedValue = value.replace(/'/g, "\\'")
    return `: '${escapedValue}'`
  })

  return str
}

// 生成表单字段配置
const generateFormColumns = (): string => {
  return formatObjectString(DEFAULT_FORM_COLUMNS)
}

// 生成表单状态
const generateFormState = (): string => {
  return formatObjectString(DEFAULT_FORM_STATE)
}

// 生成表单验证规则
const generateFormRules = (): string => {
  return formatObjectString(DEFAULT_FORM_RULES)
}

// 确保目录存在
const ensureDirectoryExists = (dirPath: string): void => {
  if (!fs.existsSync(dirPath)) {
    fs.mkdirSync(dirPath, { recursive: true })
    console.log(`✅ 创建目录: ${dirPath}`)
  }
}

// 主函数
const main = async (): Promise<void> => {
  try {
    console.log('📝 Vue表单页面生成器')
    console.log('=====================================')

    // 读取模板
    const template = loadTemplate()

    // 获取基本信息
    const moduleName = await question('请输入模块名称 (将在 src/views/ 下创建): ')
    const fileName = (await question('请输入文件名称 (默认: index.vue): ')) || 'index.vue'

    // 构建完整路径（默认在 src/views 下）
    const targetPath = path.join('src/views', moduleName)

    // 验证输入
    if (!targetPath.trim()) {
      console.log('❌ 错误: 生成路径不能为空')
      rl.close()
      return
    }

    // 显示使用的配置
    const fieldNames = DEFAULT_FORM_COLUMNS.map(field => field.prop)
    console.log(`✅ 使用内置表单字段配置`)
    console.log(`✅ 字段: ${fieldNames.join(', ')}`)

    // 确保文件名以.vue结尾
    const finalFileName = fileName.endsWith('.vue') ? fileName : `${fileName}.vue`

    // 构建完整路径
    const fullPath = path.join(process.cwd(), targetPath, finalFileName)
    const dirPath = path.dirname(fullPath)

    // 检查文件是否已存在
    if (fs.existsSync(fullPath)) {
      const overwrite = await question(`⚠️  文件 ${fullPath} 已存在，是否覆盖？(y/N): `)
      if (overwrite.toLowerCase() !== 'y' && overwrite.toLowerCase() !== 'yes') {
        console.log('❌ 操作已取消')
        rl.close()
        return
      }
    }

    // 创建目录
    ensureDirectoryExists(dirPath)

    // 生成配置
    const formColumns = generateFormColumns()
    const formState = generateFormState()
    const formRules = generateFormRules()

    // 替换模板变量
    const finalContent = template
      .replace('{{DEFAULT_FORM_COLUMNS}}', formColumns)
      .replace('{{DEFAULT_FORM_STATE}}', formState)
      .replace('{{DEFAULT_FORM_RULES}}', formRules)

    // 写入文件
    fs.writeFileSync(fullPath, finalContent, 'utf8')

    console.log('=====================================')
    console.log('✅ 表单页面生成成功!')
    console.log(`📁 路径: ${fullPath}`)
    console.log(`📄 文件名: ${finalFileName}`)
    console.log('📝 如需修改字段配置，请编辑: scripts/config/form-fields.ts')
    console.log('📝 如需修改模板，请编辑: scripts/templates/form.vue')
    console.log('=====================================')
  } catch (error) {
    console.error('❌ 生成失败:', (error as Error).message)
  } finally {
    rl.close()
  }
}

// 运行脚本
main()
